/**
 *    Copyright 2009-2024 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.apache.ibatis.scripting.xmltags;

/**
 * 用于描述动态SQL中{@literal <if>、<where>}等标签信息，LanguageDriver解析SQL配置时，会把{@literal <if>、<where>}等动态SQL标签转换为SqINode对象，封装在Sq|Source中。
 * <ul>
 *   <li>{@link IfSqlNode} - 用于描述动态SQL中{@literal <if>}标签的内容，XMLanguageDriver在解析Mapper SQL配置生成SqlSource时，会对动态SQL中的{@literal <if>}标签进行解析，将{@literal <if>}标签转换为lfSqlNode对象。</li>
 *   <li>{@link ForEachSqlNode} - 用于描述动态SQL配置中的{@literal <foreach>}标签,{@literal <foreach>}标签配置信息在Mapper解析时会转换为ForEachSqlNode对象。</li>
 *   <li>{@link ChooseSqlNode} - 用于描述动态SQL配置中的{@literal <choose>}标签内容，Mapper解析时会把{@literal <choose>}标签配置内容转换为ChooseSqINode对象。</li>
 *   <li>{@link MixedSqlNode} - 用于描述一组SqINode对象， 通常一个Mapper配置是由多个SqlNode对象组成的，这些SqlNode对象通过MixedSqlNode进行关联，组成一个完整的动态SQL配置。</li>
 *   <li>{@link SetSqlNode} - 用于描述动态SQL配置中的{@literal <set>}标签，Mapper解析时会把{@literal <set>}标签配置信息转换为SetSqINode对象。　</li>
 *   <li>{@link TrimSqlNode} - 用于描述动态SQL中的{@literal <trim>}标签，动态SQL解析时，会把{@literal <trim>}标签内容转 换为TrimSqlNode对象。在MyBatis动态SQL使用时,{@literal <where>}标签和{@literal <set>}标签实现的内容都可以使用{@literal <trim>}标签来完成，因此WhereSqlNode和SetSqlNode类设计为TrimSqlNode类的子类，属于特殊的TrimSqlNode。</li>
 *   <li>{@link StaticTextSqlNode} - 用于描述动态SQL中的静态文本内容。</li>
 *   <li>{@link TextSqlNode} - 该类与StaticTextSqlNode类不同的是，当静态文本中包含${}占位符时，说明${}需要在Mapper调用时将${}替换为具体的参数值。因此，使用TextSqlNode类来描述。</li>
 *   <li>{@link VarDeclSqlNode} - 用于描述动态SQL中的{@literal <bind>}标签，动态SQL解析时，会把<bind>标签配置信息转换为VarDeclSqlNode对象。</li>
 *   <li>{@link WhereSqlNode} - 用于描述动态SQL中的{@literal <where>}标签,动态SQL解析时，会把{@literal <where>}标签内容转换为WhereSqINode对象</li>
 * </ul>
 *
 * @author Clinton Begin
 */
public interface SqlNode {
  boolean apply(DynamicContext context);
}
